import java.util.*;

/**
 * @author LKQ
 * @date 2022/4/9 19:10
 * @description 动态规划，转移方程比较难推
 */
public class Solution3 {
    public static void main(String[] args) {

    }

    public int longestValidParentheses(String s) {
        int maxans = 0;
        // dp[i] 代表 以s[i]结尾的最长有效括号长度，当s[i] = '('，dp[i] = 0, 考虑s[i] = ')'的情况
        int[] dp = new int[s.length()];
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == ')') {
                if (s.charAt(i - 1) == '(') {
                    // 形如 ....()
                    dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2;
                } else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') {
                    // 形如 .....))
                    dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2;
                }
                maxans = Math.max(maxans, dp[i]);
            }
        }
        return maxans;
    }
}
